package com.caijg.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;

public class JwtUtils {
    /**
     * 密钥
     */
    private static final String KEY = "caijg033";

    /**
     * token 过期时间（毫秒） - 这里设置为1天
     */
    private static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;

    /**
     * 生成 JWT token
     *
     * @param userId 用户ID
     * @return token字符串
     */
    public static String createToken(Long userId) {
        return JWT.create()
                .setPayload("userId", userId)
                .setPayload(JWTPayload.EXPIRES_AT, DateUtil.current() + EXPIRE_TIME)
                .setKey(KEY.getBytes())
                .sign();
    }

    /**
     * 验证 token
     *
     * @param token JWT token
     * @return 是否有效
     */
    public static boolean verify(String token) {
        try {
            // 把token转成jwt对象
            JWT jwt = JWTUtil.parseToken(token);
            // 验证签名
            boolean verify = jwt.setKey(KEY.getBytes()).verify();
            // 验证过期时间
            boolean notExpired = Long.parseLong
                    (jwt.getPayload()
                            .getClaim(JWTPayload.EXPIRES_AT).toString()
                    )
                    > DateUtil.current();
            return verify && notExpired;
        } catch (Exception e) {
            // 如果抛出异常，说明token转jwt失败，token不合法
            return false;
        }
    }

    /**
     * 从 token 中获取用户ID
     *
     * @param token JWT token
     * @return 用户ID
     */
    public static Long getUserId(String token) {
        JWT jwt = JWTUtil.parseToken(token);
        return Long.parseLong(jwt.getPayload().getClaim("userId").toString());
    }
}